package cn.liubanglong.i18n.common;

import cn.hutool.core.util.StrUtil;
import lombok.Data;
import lombok.experimental.Accessors;

import java.io.Serializable;

/**
 * 响应请求最外层封装对象
 * 返回信息示例：
 * 成功：{"code":"1","msg":"success",data:obj}
 * 失败：{"code":"0","msg":err_msg,data:null}
 */
@Data
@Accessors(chain = true)
public class ApiResult<T> implements Serializable {
    private static final long serialVersionUID = -3295304347570018158L;
    /**
     * 错误码。1:成功 其它失败
     */
    private String code;
    /**
     * 提示信息。
     */
    private String msg;
    /**
     * 具体的内容。
     */
    private T data;

    private ApiResult(String code, String msg, T data) {
        this.code = code;
        this.msg = msg;
        this.data = data;
    }

    /**
     * 成功结果,无结果数据
     *
     * @param <T> 实体信息
     * @return 结果
     */
    public static <T> ApiResult<T> ok() {
        return ok(null);
    }

    /**
     * 成功结果
     *
     * @param data 成功响应内容
     * @param <T>  实体信息
     * @return 结果
     */
    public static <T> ApiResult<T> ok(T data) {
        return new ApiResult<>("1", "Success", data);
    }

    /**
     * 失败结果
     * 不要设置 data,保持null 否则调用方解析响应内容会报错
     *
     * @param msg 错误信息
     * @return 结果
     */
    public static <T> ApiResult<T> fail(String msg) {
        return new ApiResult<>("0", msg, null);
    }

    /**
     * 设置提示信息
     *
     * @param msg    提示信息
     * @param params 占位参数
     * @return 结果
     */
    public ApiResult<T> setMsg(String msg, Object... params) {
        this.msg = StrUtil.format(msg, params);
        return this;
    }
}